#pragma once

#include <sys_reg.h>

typedef enum {
	GPIOA_Q = 0x40010800,
	GPIOB_Q = 0x40010C00,
	GPIOC_Q = 0x40011000,
	GPIOD_Q = 0x40011400,
	GPIOE_Q = 0x40011800,
} gpio_qe;

typedef enum {
	GPIO_CTL0_R = 0x0,
	GPIO_CTL1_R = 0x4,
	GPIO_ISTAT_R = 0x8,
	GPIO_OCTL_R = 0xC,
	GPIO_BOP_R = 0x10,
	GPIO_BC_R = 0x14,
	GPIO_LOCK_R = 0x18,
} gpio_re;

static inline u32_s gpio_get_reg_q(gpio_qe gpio_q, gpio_re gpio_r) {
	return gpio_q + gpio_r;
}

static inline void gpio_wreg(gpio_qe gpio_q, gpio_re gpio_r, u32_s value) {
	u32_s reg_q = gpio_get_reg_q(gpio_q, gpio_r);
	wreg(reg_q, value);
}

static inline u32_s gpio_rreg(gpio_qe gpio_q, gpio_re gpio_r) {
	u32_s reg_q = gpio_get_reg_q(gpio_q, gpio_r);
	return rreg(reg_q);
}
